package cn.fhkj.util;

import com.qiniu.common.QiniuException;
import com.qiniu.common.Zone;
import com.qiniu.http.Response;
import com.qiniu.processing.OperationManager;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.util.Auth;
import com.qiniu.util.StringMap;
import com.qiniu.util.UrlSafeBase64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;

/**
 * 七牛 java sdk 简单上传
 * 
 * @author Linlm
 *
 */
public class SimpleUpload {
	private final static Logger logger = LoggerFactory.getLogger(SimpleUpload.class);

	Configuration cfg = new Configuration(Zone.zone0());

	// 创建上传对象
	UploadManager uploadManager = new UploadManager(cfg);

	String access_key;
	String secret_key;
	String bucket_name; // 要上传的空间 : 填写新建的那个存储空间对象的名称
	String pipeline; // 转码队列

	public SimpleUpload(String access_key, String secret_key, String bucket_name, String pipeline) {
		this.access_key = access_key;
		this.secret_key = secret_key;
		this.bucket_name = bucket_name;
		this.pipeline = pipeline;
	}
    /**
     * 没有变化的文件
     * @param filePath  文件路径  （也可以是字节数组、或者File对象）
     * @param saveFile  上传到七牛上的文件的名称  （同一个空间下，名称【saveFile】是唯一的）,如：xxx.jpg
     */
    public void uploadSourceFile(File file, String saveFile){
    	 
    	Auth auth = Auth.create(access_key, secret_key); //密钥配置  
    	String token =  auth.uploadToken(bucket_name); //获取凭证
    	
    	//初始上传
    	this.upload(file , saveFile , token);
    }
    
    public String uploadFile(File file, String saveFile) throws QiniuException {
    	Auth auth = Auth.create(access_key, secret_key); //密钥配置  
    	String token =  auth.uploadToken(bucket_name); //获取凭证
    	Response res = uploadManager.put(file, saveFile, token);
    	return res.bodyString();
    }
	/**
	 * 上传
	 * 
	 * @param filePath
	 *            文件路径 （也可以是字节数组、或者File对象）
	 * @param key
	 *            上传到七牛上的文件的名称 （同一个空间下，名称【key】是唯一的）
	 * @param bucketName
	 *            空间名称 （这里是为了获取上传凭证）
	 */
	public void upload(File file, String key, String token) {
		try {
			// 调用put方法上传
			Response res = uploadManager.put(file, key, token);
			// 打印返回的信息
			logger.debug(res.bodyString());
		} catch (QiniuException e) {
			Response r = e.response;
			// 请求失败时打印的异常的信息
			logger.error(r.toString());
			try {
				// 响应的文本信息
				logger.error(r.bodyString());
			} catch (QiniuException qe) {
				logger.error(qe.getMessage());
			}
		}
	}

	/**
	 * 七牛删除文件
	 * 
	 * @param auth
	 * @param bucketName
	 * @param saveFile
	 */
	public static void deleteFile(Auth auth, String bucketName, String saveFile) {
		Configuration config = new Configuration(Zone.autoZone());
		BucketManager bucketMgr = new BucketManager(auth, config);

		try {
			bucketMgr.delete(bucketName, saveFile);// 当前为7.2.1； 7.2.2后才能传多个key
													// ，即：第二个参数为数组 (String...
													// deleteTargets)
		} catch (QiniuException e) {
			e.printStackTrace();
			logger.error(e.getMessage());
		}
	}

	/**
	 * @param filePath
	 *            文件路径 （也可以是字节数组、或者File对象）
	 * @param saveFile
	 *            上传到七牛上的文件的名称 （同一个空间下，名称【saveFile】是唯一的）,如：xxx.jpg
	 */
	public String upload(File file, String saveFile) {

		Auth auth = Auth.create(access_key, secret_key); // 密钥配置
		String token = auth.uploadToken(bucket_name); // 获取凭证

		// 初始上传
		this.upload(file, saveFile, token);

		// //amr转mp3转换
	
          
          
		String new_savePath = formatAndupload(auth, bucket_name, saveFile, pipeline);

     

		String sourceFile = file.getName();
		String sourceKey = saveFile.substring(0, saveFile.lastIndexOf("/") + 1) + sourceFile;

		// 删除源文件
		deleteFile(auth, bucket_name, sourceKey);

		// 删除本地文件
		deleteFile(file);

		return new_savePath;
	}
	public String uploadSource(File file, String saveFile) {
		
		Auth auth = Auth.create(access_key, secret_key); // 密钥配置
		String token = auth.uploadToken(bucket_name); // 获取凭证
		
		// 初始上传
		this.upload(file, saveFile, token);
		
		String new_savePath = docUpload(auth, bucket_name, saveFile, pipeline);
		
		String sourceFile = file.getName();
		String sourceKey = saveFile.substring(0, saveFile.lastIndexOf("/") + 1) + sourceFile;
		
		// 删除源文件
		deleteFile(auth, bucket_name, sourceKey);
		
		// 删除本地文件
		deleteFile(file);
		
		return new_savePath;
	}

	/**
	 * @param filePath
	 *            文件路径 （也可以是字节数组、或者File对象）
	 * @param saveFile
	 *            上传到七牛上的文件的名称 （同一个空间下，名称【saveFile】是唯一的）,如：xxx.jpg
	 */
	public static String formatAndupload(Auth auth, String bucket_name, String saveFile, String pipeline) {
		String sname = saveFile.substring(0, saveFile.lastIndexOf("."));// 文件名，不带后缀

		// 判断是否MP3文件，如果是，不用转
		int index = saveFile.lastIndexOf(".");
		String suffix = saveFile.substring(index);
		suffix = suffix.toLowerCase();
		if ("mp3".equals(suffix)) {
			return saveFile.split("/")[1];
		}

		String new_savePath = sname + ".mp3";// 文件保存

		Zone z = Zone.zone0();
		Configuration c = new Configuration(z);

		// 新建一个OperationManager对象
		OperationManager operater = new OperationManager(auth, c);
		// 设置要转码的空间和key，并且这个key在你空间中存在
		// String bucket = bucket_name;
		// String key = saveFile;
		// 设置转码操作参数
		String fops = "avthumb/mp3";

		// 可以对转码后的文件进行使用saveas参数自定义命名，当然也可以不指定文件会默认命名并保存在当前空间。
		String urlbase64 = UrlSafeBase64.encodeToString(bucket_name + ":" + new_savePath);
		String pfops = fops + "|saveas/" + urlbase64;
		// 设置pipeline参数
		StringMap params = new StringMap().putWhen("force", 1, true).putNotEmpty("pipeline", pipeline);
		try {
			String persistid = operater.pfop(bucket_name, saveFile, pfops, params);
			// 打印返回的persistid
		} catch (QiniuException e) {
			// 捕获异常信息
			Response r = e.response;
			// 请求失败时简单状态信息
			logger.error(r.toString());
			try {
				// 响应的文本信息
				logger.error(r.bodyString());
			} catch (QiniuException e1) {
				e.printStackTrace();
				logger.error(e1.getMessage());
			}
		}

		return new_savePath.split("/")[1];
	}
	public static String docUpload(Auth auth, String bucket_name, String saveFile, String pipeline) {
		
		int index = saveFile.lastIndexOf(".");
		String suffix = saveFile.substring(index);
		suffix = suffix.toLowerCase();
		return saveFile.split("/")[1];
		
		
	}

	/**
	 * 删除单个文件
	 *
	 * @param fileName
	 *            要删除的文件的文件名
	 * @return 单个文件删除成功返回true，否则返回false
	 */
	public static boolean deleteFile(File file) {
		String fileName = file.getName();
		// 如果文件路径所对应的文件存在，并且是一个文件，则直接删除
		if (file.exists() && file.isFile()) {
			if (file.delete()) {
				logger.info("删除单个文件" + fileName + "成功！");
				return true;
			} else {
				logger.info("删除单个文件" + fileName + "失败！");
				return false;
			}
		} else {
			logger.info("删除单个文件失败：" + fileName + "不存在！");
			return false;
		}
	}

	/**
	 * 主函数：程序入口，测试功能
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		File source = new File("C:\\Users\\Public\\Music\\Sample Music\\555.amr");

		String fileName_temp = source.getName();// 文件原名
		String sname = fileName_temp.substring(0, fileName_temp.lastIndexOf("."));// 文件名，不带后缀
		String fileName = sname + ".mp3";// 文件全名
		String savePath = "audio/" + fileName_temp;
	}

}
